<?php
require_once 'PHPUnit/Framework.php';
require_once "amicitia/conf/Conf.class.php";
require_once 'amicitia/arquitectura/Cargador.class.php';
def("amicitia/persistencia/daos/","ConexionBD");
def("amicitia/persistencia/daos/","FabricaDao");
def("amicitia/modelo/entidades/","Deseo");
def("amicitia/modelo/entidades/","Persona");
def("amicitia/modelo/entidades/","Juego");

/**
 * Prueba todo lo concerniente al DaoDeseo.
 *
 * @author Willy A. Kuster
 */
class PruebaDaoDeseo extends PHPUnit_Framework_TestCase {

	private $daoDeseo;

	/**
	 * Realiza la conexión a la base de datos y crea una instancia de
	 * DaoDeseo.
	 */
	protected function setUp() {
		ConexionBD::getConexionBD()->conectar();
		$fabricaDao = FabricaDao::obtenerFabrica();
		$this->daoDeseo = $fabricaDao->obtenerDaoDeseo();
	}

	/**
	 * Prueba la obtención de un deseo.
	 */
	public function testObtenerDeseo() {
		$id = 10;
		
		$deseoEsperado = new Deseo();
		$deseoEsperado->setId($id);
		$deseoEsperado->setTexto("Libro de programación");
		$deseoEsperado->setRegalo("Libro de programación");
		
		$personaEsperada = new Persona();
		$personaEsperada->setId(10);
		$personaEsperada->setAlias("willykc");
		$personaEsperada->setPassword("332caee2c3b1786392e8cf5f046f115edb206078");
		$personaEsperada->setNombre("Willy");
		$personaEsperada->setApellido("Kuster");
		$personaEsperada->setEmail("willykc@gmail.com");
		$personaEsperada->setSexo("m");
		
		$deseoEsperado->setIluso($personaEsperada);
		
		$deseo = $this->daoDeseo->obtenerDeseo($id);
		$this->assertEquals($deseoEsperado, $deseo);
	}
	
	/**
	 * Prueba la obtención de un deseo en función de una persona y un juego
	 * determinado.
	 */
	public function testObtenerDeseoJuegoYPersona() {
		$id = 10;
		
		$personaEsperada = new Persona();
		$personaEsperada->setId(10);
		$personaEsperada->setAlias("willykc");
		$personaEsperada->setPassword("332caee2c3b1786392e8cf5f046f115edb206078");
		$personaEsperada->setNombre("Willy");
		$personaEsperada->setApellido("Kuster");
		$personaEsperada->setEmail("willykc@gmail.com");
		$personaEsperada->setSexo("m");
		
		$juego = new Juego();
		$juego->setId(1);
		
		$deseoEsperado = new Deseo();
		$deseoEsperado->setId($id);
		$deseoEsperado->setTexto("Libro de programación");
		$deseoEsperado->setRegalo("Libro de programación");
		$deseoEsperado->setIluso($personaEsperada);
		
		$deseo = $this->daoDeseo->obtenerDeseoDeJuegoYPersona($juego,$personaEsperada);
		$this->assertEquals($deseoEsperado, $deseo);
	}
	
	/**
	 * Prueba el caso en el que se pase un id que no tiene un registro asociado
	 * en la base de datos.
	 */
	public function testObtenerDeseoNoExistente() {
		$deseo = $this->daoDeseo->obtenerDeseo(0);
		$this->assertEquals(NULL, $deseo);
	}
	
	/**
	 * Prueba el guardado de un deseo en la base de datos.
	 */
	public function testGuardarDeseo() {
		$deseo = new Deseo();
		$deseo->setRegalo("regalo");
		$deseo->setTexto("deseo");
		
		$persona = new Persona();
		$persona->setId(10);
		$persona->setAlias("willykc");
		$persona->setPassword("332caee2c3b1786392e8cf5f046f115edb206078");
		$persona->setNombre("Willy");
		$persona->setApellido("Kuster");
		$persona->setEmail("willykc@gmail.com");
		$persona->setSexo("m");
		$deseo->setIluso($persona);
		
		$juego = new Juego();
		$juego->setId(2);
		
		$id = $this->daoDeseo->guardarDeseo($deseo,$juego);
		
		$deseoGuardado = $this->daoDeseo->obtenerDeseo($id);
		
		$deseo->setId($id);
		
		$this->assertEquals($deseo, $deseoGuardado);
	}
	
	/**
	 * Prueba el borrado de un deseo en la base de datos.
	 */
	public function testEliminarDeseo() {
		$deseo = new Deseo();
		$deseo->setRegalo("regalo");
		$deseo->setTexto("deseo");
		
		$persona = new Persona();
		$persona->setId(10);
		$deseo->setIluso($persona);
		
		$juego = new Juego();
		$juego->setId(2);
		
		$id = $this->daoDeseo->guardarDeseo($deseo,$juego);
		
		$exito = $this->daoDeseo->eliminarDeseo($id);
		
		$deseo = $this->daoDeseo->obtenerDeseo($id);
		
		$this->assertTrue($exito);
		$this->assertEquals(NULL, $deseo);
	}
	
	/**
	 * Deshace todos los cambios y cierra la conexión a la base de datos.
	 */
	protected function tearDown() {
		ConexionBD::getConexionBD()->deshacer();
		ConexionBD::getConexionBD()->desconectar();
	}
	
}
?>